
  //类
  class Person {
    /* 
      ts可以在属性前添加属性的修饰符
      public  公共属性 修饰的属性可以在任意位置访问修改 （默认值）
      private 私有属性 修饰的属性只能在内部访问修改  通过类中的方法可以访问修改
      protected  受保护的属性  可以在父类和子类中访问
     */
      name: string;
      age: number;
      _sex='man' //实例属性  new之后可以直接访问 （new Person1.name）
      static a="person" //静态属性  只能通过类访问 （Person1.name）
      private b = 'bbb'   //私有属性 修饰的属性只能在内部访问修改  通过类中的方法可以访问修改 也可以直接使用get set 方法对公共属性进行修改 不用再写private关键字
      constructor(name:string,age:number) {
        this.name = name
        this.age = age
      }
      static say(){    //静态方法  只能通过类访问 （Person1.say()）
        console.log(this.name)
      }
      say1(){
        console.log(this.name)
      }
      get sex (){
        return this._sex               
      }
      set sex (value:string) {
        this._sex  = value              
      }
    }
    let p1 = new Person("小黄",3) 
    p1.sex   //访问sex相当于直接调用了get sex 方法 
    p1.sex  = 'sss'  //相当于直接调用了set sex 方法   我们可以在set方法上限制值  实现控制权还是在我手上

//继承   
class Teacher extends Person {
  code:number
  constructor(name:string,age:number,code:number) {
    super(name,age);  //super就是父类  super()表示调用父类中的constructor
    this.code = code 
  }
  say(){
    console.log('hi world ');  //与父类重名  则表示重写方法
  }
}
let t1 = new Teacher("小黄",3,110)


//抽象类 不能创建实例（不能new Animal） 一般是当作父类  只用于继承 
    //abstract 只用于ts文件
    abstract class Animal{
      name: string;
      constructor(name:string){
        this.name = name
      }
      abstract say(): any  //表示通过Animal继承的子类中必须从写say方法
    }


    //类的语法糖  简洁写法  
  class z {
    name: string;
    age:number;
    constructor(name:string,age:number){
      this.name = name
      this.age = age
    }
  }
  class Z {
    constructor(public name:string,public age:number){
    }
  }
  
